/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package negocio;

import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Display;
import javax.microedition.midlet.MIDlet;
import util.Constantes;
import comunicacao.*;
import gui.TelaJogo;
import gui.Telas;
import jogo.JogoCliente;
import jogo.JogoServidor;

/**
 * @author Thiago Nascimento e Pablo Viana
 */
public class Anker extends MIDlet implements CommandListener {

    private Telas telas;
    private Cliente cliente;
    private Servidor servidor;
    private Comunicacao comunicacao;
    
    public Anker() {
    }

    // INTERFACE MIDLET ////////////////////////////////////////////////////////
    public void startApp() {
        this.telas = new Telas(Display.getDisplay(this), this);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        this.sairDoJogo();
    }

    // INTERFACE COMMAND LISTENER //////////////////////////////////////////////
    public void commandAction(Command c, Displayable d) {
        if (this.telas.estaNaTelaNomeJogador()) {
            this.comandoTelaNome(c);
        } else if (this.telas.estaNaTelaConectados()) {
            this.comandoTelaConectados(c);
        } else if (this.telas.estaNaTelaServidores()) {
            this.comandoTelaServidores(c);
        } else if (this.telas.estaNaTelaMenuPrincipal()) {
            this.commandoTelaMenu(c);
        }else if (this.telas.estaNaTelaNiveis()) {
            this.comandoMenuNivel(c);
        }
    }

    // METODOS DE ACOES DE COMANDOS ////////////////////////////////////////////
    private void comandoTelaNome(Command c) {
        if (c.equals(Constantes.CMD_OK)) {
            String nome = this.telas.getNomeJogador();
            if(!nome.equals("")) {
                this.telas.mostrarTelaMenuPrincipal();
            } else {
                this.telas.mostrarAlerta("Escreva seu nome");
            }
        }
    }

    private void commandoTelaMenu(Command c) {
        if (c.equals(Constantes.CMD_OK)) {
            switch (this.telas.getSelecaoMenuPrincipal()) {
                case 0:
                    this.iniciarJogo();
                    this.comecarJogo();
                    this.telas.mostrarTelaConectados();
                    break;
                case 1:
                    this.procurarJogo();
                    this.telas.mostrarTelaServidores();
                    break;
                case 5:
                    this.fecharAplicativo();
                    break;
                case 4:
                    this.telas.mostrarTelaMenuNivel();
                    break;
                default:
            }
        } else if (c.equals(Constantes.CMD_SAIR)) {
            this.fecharAplicativo();
        }
    }

    private void comandoTelaConectados(Command c) {
        if (c.equals(Constantes.CMD_JOGAR)) {
            if(this.servidor != null) {
                this.comecarPartida();
            } else {
                this.telas.mostrarAlerta("Espere o servidor iniciar a partida");
            }
        }
    }
    
    private void comandoTelaServidores(Command c) {
        if (c.equals(Constantes.CMD_JOGAR)) {
            this.telas.mostrarTelaConectados();
            int index = this.telas.getSelecaoServidores();
            ComunicacaoRemota remota = (ComunicacaoRemota)this.comunicacao;
            remota.conectarNoServidor(index);
            this.comecarJogo();            
        } else if(c.equals(Constantes.CMD_VOLTAR)) {
            this.telas.mostrarTelaMenuPrincipal();
            this.sairDoJogo();
        }
    }    
    
    // ACOES DO JOGO ///////////////////////////////////////////////////////////
    private void iniciarJogo() {
        JogoServidor jogoServidor = new JogoServidor();
        this.comunicacao = new ComunicacaoLocal(jogoServidor);
        this.servidor = new Servidor(jogoServidor);
        this.servidor.start();        
    }

    private void procurarJogo() {
        this.comunicacao = new ComunicacaoRemota(this.telas);
    }

    private void comecarJogo() {
        String nomeJogador = this.telas.getNomeJogador();
        JogoCliente jogoCliente = new JogoCliente(this.telas, nomeJogador);
        
        TelaJogo telaJogo = new TelaJogo(this.comunicacao, jogoCliente);
        this.telas.setTelaJogo(telaJogo);
        
        this.cliente = new Cliente(this.comunicacao, nomeJogador, jogoCliente);
        this.cliente.start();
    }
    
    private void comecarPartida() {
        this.servidor.comecarPartida(this.telas.getSelecaoNivel());
    }
        
    private void sairDoJogo() {        
        if(this.servidor != null) this.servidor.interrupt();
        if(this.cliente != null) this.cliente.interrupt();
        this.comunicacao = null;
        this.servidor = null;
        this.cliente = null;
    }
    
    private void fecharAplicativo() {
        destroyApp(true);
        notifyDestroyed();
    }
    
    private void comandoMenuNivel(Command c) {
        if (c.equals(Constantes.CMD_OK)) {
            this.telas.mostrarTelaMenuPrincipal();
            
        }
    }
    
}
